/*
 * SkinNode.h
 *
 *  Created on: 2012/03/15
 *      Author: takedanaoki
 */

#ifndef INCLUDED_NTENGINE_SCENE_SKINNODE_H
#define INCLUDED_NTENGINE_SCENE_SKINNODE_H

#include "NTEngine/Xml/Element.h"
#include "NTEngine/Xml/Attribute.h"
#include "NTEngine/Scene/Container.h"
#include "NTEngine/Math/Matrix3x4.h"

namespace NTEngine {
using namespace Math;
namespace Xml {
class ConstElement;
} // namespace Xml
namespace Scene {

class SkinNode {
public:
	//この関数はコンテナを使うので、インクルードループを避けるためにSkinNode.cppにおいてある。
	SkinNode( Xml::ConstElement&, Container::Impl&, Matrix3x4* );
	~SkinNode() {
		mName = 0; //コンテナが持っているので参照を外すだけ
		mBones = 0;
		deleteWeights();
	}
	void update( const Matrix3x4& transform, int id ) const {
		mBones[ id ].setMul( transform, mOffset );
	}
	/// 不要になったら破棄する用
	void deleteWeights() {
		SAFE_DELETE_ARRAY( mWeights );
		SAFE_DELETE_ARRAY( mVertexIndeices );
	}
	float weights( int i ) const {
		return mWeights[ i ];
	}
	int vertexIndex( int i ) const {
		return mVertexIndeices[ i ];
	}
	int weightNumber() const {
		return mWeightNumber;
	}
	const char* name() const {
		return mName;
	}
	void setOffset( const Matrix3x4& m ) {
		mOffset = m;
	}
private:
	void build( Xml::ConstElement&, int );
	int mWeightNumber;
	float* mWeights;
	int* mVertexIndeices;
	const char* mName;
	Matrix3x4* mBones;
	Matrix3x4 mOffset;
};

} // namespace Scene
} // namespace NTEngine

#endif // INCLUDED_NTENGINE_SCENE_SKINNODE_H
